package com.shenmazong.manage.controller;

import com.shenmazong.manage.entity.*;
import com.shenmazong.manage.service.TaskManageService;
import com.shenmazong.utils.ResultResponse;
import com.shenmazong.vo.*;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * @description 作业管理控制层
 * @author Qi
 * @date 2021/9/18 17:08
 * @version 1.0
 */
@Api(tags = "作业管理")
@RestController
@RequestMapping("manage")
public class TaskManageController {

    @Autowired
    private TaskManageService service;
    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * @description 作业布置安排新增
     * @params [tbTaskLayout]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:23
     */
    @PostMapping("saveTaskLayout")
    public ResultResponse saveTaskLayout(@RequestBody TbTaskLayout tbTaskLayout){
        return service.saveTaskLayout(tbTaskLayout);
    }

    /**
     * @description 作业布置安排修改
     * @params [tbTaskLayout]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:23
     */
    @PostMapping("updateTaskLayout")
    public ResultResponse updateTaskLayout(@RequestBody TbTaskLayout tbTaskLayout){
        return service.updateTaskLayout(tbTaskLayout);
    }

    /**
     * @description 作业布置安排批量删除
     * @params [chooseIdVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:23
     */
    @PostMapping("deleteTaskLayout")
    public ResultResponse deleteTaskLayout(@RequestBody BatchChooseIdVo chooseIdVo){
        return service.deleteTaskLayout(chooseIdVo);
    }

    /**
     * @description 作业布置安排列表
     * @params [paramVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:24
     */
    @PostMapping("listTaskLayout")
    public ResultResponse listTaskLayout(@RequestBody ListParamVo paramVo){
        return service.listTaskLayout(paramVo);
    }

    /**
     * @description 根据ID获取作业布置安排
     * @params [tbTaskLayout]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:24
     */
    @PostMapping("getTaskLayout")
    public ResultResponse getTaskLayout(@RequestBody TbTaskLayout tbTaskLayout){
        return service.getTaskLayout(tbTaskLayout);
    }

    /**
     * @description 作业提交内容新增
     * @params [tbTaskSubmit]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:24
     */
    @PostMapping("saveTaskSubmit")
    public ResultResponse saveTaskSubmit(@RequestBody TbTaskSubmit tbTaskSubmit){
        return service.saveTaskSubmit(tbTaskSubmit);
    }

    /**
     * @description 作业提交内容批量删除
     * @params [chooseIdVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:24
     */
    @PostMapping("deleteTaskSubmit")
    public ResultResponse deleteTaskSubmit(@RequestBody BatchChooseIdVo chooseIdVo){
        return service.deleteTaskSubmit(chooseIdVo);
    }

    /**
     * @description 作业提交内容修改
     * @params [tbTaskSubmit]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:24
     */
    @PostMapping("updateTaskSubmit")
    public ResultResponse updateTaskSubmit(@RequestBody TbTaskSubmit tbTaskSubmit){
        return service.updateTaskSubmit(tbTaskSubmit);
    }

    /**
     * @description 作业提交内容列表
     * @params [paramVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:24
     */
    @PostMapping("listTaskSubmit")
    public ResultResponse listTaskSubmit(@RequestBody ListParamVo paramVo){
        return service.listTaskSubmit(paramVo);
    }

    /**
     * @description 根据ID获取作业提交内容
     * @params [tbTaskSubmit]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/21 17:24
     */
    @PostMapping("getTaskSubmit")
    public ResultResponse getTaskSubmit(@RequestBody TbTaskSubmit tbTaskSubmit){
        return service.getTaskSubmit(tbTaskSubmit);
    }

    /**
     * @description 所有专业
     * @params [tbMajor]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/23 16:26
     */
    @PostMapping("listAllMajor")
    public ResultResponse listAllMajor(@RequestBody TbMajor tbMajor){
        return service.listAllMajor(tbMajor);
    }

    /**
     * @description 课程列表
     * @params [paramVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/23 16:26
     */
    @PostMapping("listStage")
    public ResultResponse listStage(@RequestBody ListParamVo paramVo){
        return service.listStage(paramVo);
    }

    /**
     * @description 所有课程列表
     * @params [paramVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/23 16:26
     */
    @PostMapping("listAllStage")
    public ResultResponse listAllStage(@RequestBody BatchChooseIdVo chooseIdVo){
        return service.listAllStage(chooseIdVo);
    }

    /**
     * @description //理论作业模板新增
     * @params [theoryTemplate]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/26 8:27
     */
    @PostMapping("saveTheoryTemplate")
    public ResultResponse saveTheoryTemplate(@RequestBody TbTaskTheoryTemplate theoryTemplate){
        return service.saveTheoryTemplate(theoryTemplate);
    }

    /**
     * @description //理论作业模板删除
     * @params [chooseIdVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/26 8:27
     */
    @PostMapping("deleteTheoryTemplate")
    public ResultResponse deleteTheoryTemplate(@RequestBody BatchChooseIdVo chooseIdVo){
        return service.deleteTheoryTemplate(chooseIdVo);
    }

    /**
     * @description //理论作业模板修改
     * @params [theoryTemplate]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/26 8:27
     */
    @PostMapping("updateTheoryTemplate")
    public ResultResponse updateTheoryTemplate(@RequestBody TbTaskTheoryTemplate theoryTemplate){
        return service.updateTheoryTemplate(theoryTemplate);
    }

    /**
     * @description //理论作业模板列表
     * @params [paramVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/26 8:27
     */
    @PostMapping("listTheoryTemplate")
    public ResultResponse listTheoryTemplate(@RequestBody ListParamVo paramVo){
        return service.listTheoryTemplate(paramVo);
    }

    /**
     * @description  //理论作业模板所有列表
     * @params []
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/26 8:28
     */
    @PostMapping("listAllTheoryTemplate")
    public ResultResponse listAllTheoryTemplate(){
        return service.listAllTheoryTemplate();
    }

    //理论作业试题内容新增
    @PostMapping("saveTheoryContent")
    public ResultResponse saveTheoryContent(@RequestBody TheoryContentVo contentVo){
        return service.saveTheoryContent(contentVo);
    }

    //理论作业试题内容修改
    @PostMapping("updateTheoryContent")
    public ResultResponse updateTheoryContent(@RequestBody TbTaskTheoryContent theoryContent){
        return service.updateTheoryContent(theoryContent);
    }

    //根据mongoID获取试题内容
    @PostMapping("getContentByMongo")
    public ResultResponse getContentByMongo(@RequestBody ContentToMongo content){
        return service.getContentByMongo(content);
    }

    /**
     * @description 根据登录学生班级ID获取作业安排信息
     * @params [studentVo]
     * @return com.shenmazong.utils.ResultResponse
     * @author Qi
     * @date 2021/9/28 18:44
     */
    @PostMapping("listTaskByClazz")
    public ResultResponse listTaskByClazz(@RequestBody TaskStudentVo studentVo){
        return service.listTaskByClazz(studentVo);
    }

    //定时检查 半小时执行一次 将作业开始时间小于1小时的作业放入展示集合
    @Scheduled(fixedRate = 1800000L)
    @PostMapping("getTaskLayoutToRedisByTiming")
    public void getTaskLayoutToRedisByTiming(){
        service.getTaskLayoutToRedisByTiming();
    }

    //根据ID 将作业安排放入Redis展示集合
    @PostMapping("getLayoutToRedisById")
    public ResultResponse getLayoutToRedisById(@RequestBody TbTaskLayout layout){
        return service.getLayoutToRedisById(layout);
    }

    //点击开始作业
    @PostMapping("startTask")
    public ResultResponse startTask(@RequestBody TaskStudentVo taskStudentVo){
        //根据班级试题安排 获取Redis中存的状态
        String statusKey = "task_status_"+taskStudentVo.getLayoutId();
        if(!redisTemplate.hasKey(statusKey)){
            return ResultResponse.FAILED("错误,该考试不存在,请联系管理员");
        }
        if("0".equals(redisTemplate.opsForValue().get(statusKey))){
            return ResultResponse.FAILED("该考试未开始,请稍后再试");
        }else if ("1".equals(redisTemplate.opsForValue().get(statusKey))){
            return service.startTask(taskStudentVo);
        }else {
            return ResultResponse.FAILED("该考试已结束");
        }
    }

    //定时任务 每5秒执行一次 用于设置考试开始和结束的状态
    @Scheduled(fixedRate = 5000L)
    @PostMapping("setTaskStartOrEnd")
    public void setTaskStartOrEnd(){
        //判断Redis中是否存在正在展示的作业
        String showTask = "show_task";
        //不存在则直接返回 不执行
        if(!redisTemplate.hasKey(showTask)){
            return;
        }
        //存在则执行后续判断方法
        service.setTaskStartOrEnd();
    }
}



